home *** CD-ROM | disk | FTP | other *** search
/ MacWorld Secrets (4th Edition) / Mac Secrets CD 4th Ed.toast / Apple Advanced Technologies / Apple Speech Technologies 1.5 / PlainTalk Developer Info / Speech Recognition Manager SDK / SR Sample Code / Speakable Items Example / Sources / SpeakableItems.c < prev    next >
Text File  |  1996-02-22  |  6KB  |  231 lines

  1. /*****************************************************************************/
  2.  
  3. #include <String.h>
  4. #include <Folders.h>
  5. #include <Files.h>
  6. #include <Script.h>
  7. #include "FinderUtils.h"
  8. #include "SpeakableItems.h"
  9.  
  10. #define kSIUpdatePeriods 120
  11.  
  12. #define kSIStrsID         550
  13. #define    kSILMName        1
  14. #define    kSIFolderName    2
  15.  
  16.  
  17. unsigned long    gNextSIUpdateTick;
  18. unsigned long    gFolderModDate;
  19.  
  20. short            gSIFolderVRefNum;
  21. unsigned long    gSIFolderDirID;
  22.  
  23. OSErr RefetchSIFolderItems (SRRecognitionSystem system, SRLanguageModel siModel);
  24. OSErr GetFileID (StringPtr name, short vRefNum, long parentDirID, long *fileID);
  25.  
  26. /*****************************************************************************/
  27.  
  28. OSErr SIInitSpeakableItems (SRRecognitionSystem system, SRLanguageModel *siModel)
  29. {
  30.     OSErr             status;
  31.     long            foundDirID;
  32.     CInfoPBRec        pb;
  33.     Str255            name;
  34.     SRLanguageModel    newModel = 0;
  35.     long            refCon = kSIModelRefCon;
  36.     
  37.     /*    get vRefNum and dirID of speakable items folder */
  38.     status = FindFolder(kOnSystemDisk, kAppleMenuFolderType, true,
  39.                             &gSIFolderVRefNum, &foundDirID);
  40.     if (!status) {
  41.         GetIndString(name, kSIStrsID, kSIFolderName);
  42.         pb.dirInfo.ioCompletion = NULL;
  43.         pb.dirInfo.ioNamePtr = name;
  44.         pb.dirInfo.ioVRefNum = gSIFolderVRefNum;
  45.         pb.dirInfo.ioFDirIndex = 0; /* get info on named item */
  46.         pb.dirInfo.ioDrDirID = foundDirID;
  47.         status = PBGetCatInfo((CInfoPBPtr)&pb, false);
  48.         if (!status)
  49.             gSIFolderDirID = pb.dirInfo.ioDrDirID;
  50.     }
  51.     
  52.     if (!status) {
  53.         /*    allow immediate update of LM representing speakable items */
  54.         gNextSIUpdateTick = (unsigned long)TickCount() - 1;
  55.         gFolderModDate = (unsigned long)pb.dirInfo.ioDrMdDat - 1;
  56.     
  57.         /*    create speakable items LM and initialize it */
  58.         GetIndString(name, kSIStrsID, kSILMName);
  59.         status = SRNewLanguageModel (system, &newModel, name+1, name[0]);
  60.         if (!status)
  61.             status = SRSetProperty (newModel, kSRRefCon, &refCon, sizeof(refCon));
  62.         if (!status) {
  63.             status = SIUpdateSpeakableItems (system, newModel);
  64.             if (status) {
  65.                 SRReleaseObject (newModel);
  66.                 newModel = 0;
  67.             }
  68.         }
  69.     }
  70.     
  71.     *siModel = newModel;
  72.     return status;
  73. }
  74.  
  75. /*****************************************************************************/
  76. /*    SIUpdateSpeakableItems changes the given model so it contains the names
  77.     of every file in the Speakable Items folder in the Apple Menu Items
  78.     folder -- the folder whose identifying information was fetched in the
  79.     SIInitSpeakableItems call.
  80. */
  81.  
  82. OSErr SIUpdateSpeakableItems (SRRecognitionSystem system, SRLanguageModel siModel)
  83. {
  84.     CInfoPBRec    pb;
  85.     OSErr        status = noErr;
  86.  
  87.     //    only check every couple seconds
  88.     if ((unsigned long)TickCount() > gNextSIUpdateTick) {
  89.         
  90.         //    only proceed if folder's modification date changed since last check
  91.         pb.dirInfo.ioCompletion = NULL;
  92.         pb.dirInfo.ioNamePtr = NULL;
  93.         pb.dirInfo.ioVRefNum = gSIFolderVRefNum;
  94.         pb.dirInfo.ioFDirIndex = -1; /* get info ioDrDirID directory */
  95.         pb.dirInfo.ioDrDirID = gSIFolderDirID;
  96.         status = PBGetCatInfo((CInfoPBPtr)&pb, false);
  97.         if (!status && (unsigned long)pb.dirInfo.ioDrMdDat != gFolderModDate) {
  98.             gFolderModDate = (unsigned long)pb.dirInfo.ioDrMdDat;
  99.             status = RefetchSIFolderItems (system, siModel);
  100.         }
  101.  
  102.         gNextSIUpdateTick = (unsigned long)TickCount() + kSIUpdatePeriods;
  103.     }
  104.     
  105.     return status;
  106. }
  107.  
  108. /*****************************************************************************/
  109.  
  110. // Adds name of each item in Speakable Items folder to given language model..
  111.  
  112. OSErr RefetchSIFolderItems (SRRecognitionSystem system, SRLanguageModel siModel)
  113. {
  114.     CInfoPBRec        pb;
  115.     OSErr             status = noErr;
  116.     short            index;
  117.     Str255            name;
  118.     long            refCon, fileID;
  119.     
  120.     //    empty out old LM
  121.     status = SREmptyLanguageObject (siModel);
  122.  
  123.     //    add name of each item in Speakable Items folder
  124.     if (!status) {
  125.         
  126.         //    add each speakable item to itemsModel
  127.         index = 1;
  128.         while (!status) {
  129.             pb.dirInfo.ioCompletion = NULL;
  130.             pb.dirInfo.ioNamePtr = name;
  131.             name[0] = 0;
  132.             pb.dirInfo.ioVRefNum = gSIFolderVRefNum;
  133.             pb.dirInfo.ioFDirIndex = index;
  134.             pb.dirInfo.ioDrDirID = gSIFolderDirID;
  135.             
  136.             status = PBGetCatInfo((CInfoPBPtr)&pb, false);
  137.             if (!status)
  138.                 status = GetFileID (name, gSIFolderVRefNum, gSIFolderDirID, &fileID);
  139.  
  140.             if (!status && name[0] > 0) {
  141.                 UpperText ((Ptr)(name+1), name[0]);
  142.                 status = SRAddText (siModel, name+1, name[0], fileID);
  143.             }
  144.     
  145.             index++;
  146.         }
  147.         if (status == fnfErr)
  148.             status = noErr;
  149.     }
  150.         
  151.     return status;
  152. }
  153.  
  154. /*****************************************************************************/
  155.  
  156. OSErr GetFileID (StringPtr name, short vRefNum, long parentDirID, long *fileID)
  157. {
  158.     FIDParam                block;
  159.     FIDParam                *pb = █
  160.     OSErr                    status;
  161.  
  162.     pb->ioCompletion = NULL;
  163.     pb->ioNamePtr = name;
  164.     pb->ioVRefNum = vRefNum;
  165.     pb->ioSrcDirID = parentDirID;
  166.     status = PBCreateFileIDRefSync ((HParmBlkPtr)pb);
  167.     if (status == fidExists) status = noErr;
  168.     if (!status)
  169.         *fileID = pb->ioFileID;
  170.     else
  171.         *fileID = 0;
  172.     return status;
  173. }
  174.  
  175. /*****************************************************************************/
  176.  
  177. OSErr SIProcessResult (SRLanguageModel siResModel)
  178. {
  179.     OSErr            status;
  180.     SRPhrase        phrase = 0;
  181.     long            fileID;
  182.     Size            len = sizeof(fileID);
  183.     FSSpec            itemFSSpec;
  184.     CInfoPBRec        pb;
  185.     SRLanguageModel    itemsLM;
  186.     SRLanguageObject        subLM;
  187.     SRPath            path;
  188.     long            numItems;
  189.     FIDParam        block;
  190.     FIDParam        *pb2 = █
  191.     
  192.     //    get subelement of given language model (siResModel). 
  193.     //    since siResModel parallels the model we built in RefetchSIFolderItems()
  194.     //    above, the subelement will be a copy of one of the phrases
  195.     //    that was added to that model.  Each of those phrases is the name
  196.     //    of an item in the Speakable Items folder.  And the refCon of each
  197.     //    phrase gives the fileID of the corresponding file.
  198.  
  199.     status = SRGetIndexedItem (siResModel, &phrase, 0);
  200.  
  201.     if (!status && phrase) {
  202.         //    get fileID, stored as refCon
  203.         status = SRGetProperty (phrase, kSRRefCon, &fileID, &len);
  204.     
  205.         //    resolve file id to get original name
  206.         if (!status) {
  207.             pb2->ioCompletion = NULL;
  208.             pb2->ioNamePtr = itemFSSpec.name;
  209.             pb2->ioVRefNum = gSIFolderVRefNum;
  210.             pb2->ioFileID = fileID;
  211.             status = PBResolveFileIDRef((HParmBlkPtr)pb2, false);
  212.             if (!status) {
  213.                 itemFSSpec.vRefNum = gSIFolderVRefNum;
  214.                 itemFSSpec.parID = gSIFolderDirID;
  215.             }
  216.         }
  217.     
  218.         //    open file
  219.         if (!status)
  220.             status = FUOpenFinderItem(&itemFSSpec, false);
  221.  
  222.         //    release extra reference now that we're done with it
  223.         SRReleaseObject (phrase);
  224.     }
  225.     
  226.     return status;
  227. }
  228.  
  229. /*****************************************************************************/
  230.  
  231.